<?php

class CriarHelper {

    /**
     * Enter description here...
     *
     * @param Tabela $objTabela
     * @return String
     */
    public static function execute($objTabela) {
        $t = '    ';
        /* Primeiro caracter em maiusculo, como manda a convencao. */
        $varNameClasse = Util::nomeDbToClasse($objTabela->getNomeTabela());
        $atrNameClasse = Util::nomeDbToAtributo($objTabela->getNomeTabela());

        /* Iniciando a criacao do conteudo do arquivo */
        $conteudo = '<?php' . "\n";
        $conteudo .= "$t" . 'require_once ROOT . \'server/classes/arquitetura/helper/AbstractHelper.class.php\';' . "\n";

        /* Class */
        $conteudo .= "\n$t" . 'class ' . $varNameClasse . "Helper extends AbstractHelper {\n\n";

        //Method get from request
        $conteudo .= "$t$t/**\n";
        $conteudo .= "$t$t" . ' * Building ' . $varNameClasse . ' object' . "\n";
        $conteudo .= "$t$t" . ' * @param $objRequest  Pass $_POST or $_GET or $_REQUEST' . "\n$t$t */\n";

        $conteudo .= "$t$t" . 'public static function getObjFromRequest($objRequest) {' . "\n";

        $conteudo .= "$t$t$t$" . $atrNameClasse . ' = new ' . $varNameClasse . '();' . "\n";

        for ($i = 0; $i < count($objTabela->getCampos()); $i++) {
            /* Criando as chamadas aos setters */
            if ($objTabela->getCampo($i) != 'insert_date' && $objTabela->getCampo($i) != 'ativo') {
                $conteudo .= "$t$t$t$" . $atrNameClasse . '->set' . Util::nomeDbToClasse($objTabela->getCampo($i)) . '(Util::getRequestVal($objRequest, \'' . Util::nomeDbToAtributo($objTabela->getCampo($i)) . '\'));' . "\n";
            }
        }
        $conteudo .= "$t$t    return $" . $atrNameClasse . ";\n";
        $conteudo .= "$t$t}\n";

        /*
         * Method get from database
         */
        $conteudo .= "\n$t$t/**\n";
        $conteudo .= "$t$t" . ' * Building ' . $varNameClasse . ' object' . "\n";
        $conteudo .= "$t$t" . ' * @param $objDB  Pass the object returned from Database' . "\n$t$t */\n";

        $conteudo .= "$t$t" . 'public static function getObjFromDB($objDB) {' . "\n";

        $conteudo .= "$t$t$t$" . $atrNameClasse . ' = new ' . Util::nomeDbToClasse($objTabela->getNomeTabela()) . '();' . "\n";

        for ($i = 0; $i < count($objTabela->getCampos()); $i++) {
            /* Criando as chamadas aos setters */
            if ($objTabela->getCampo($i) != 'ativo') {
                $conteudo .= "$t$t$t$" . $atrNameClasse . '->set' . Util::nomeDbToClasse($objTabela->getCampo($i)) . '(Util::getObjUsingKey($objDB, \'' . $objTabela->getCampo($i) . '\'));' . "\n";
            }
        }
        $conteudo .= "$t$t    return $" . $atrNameClasse . ";\n";
        $conteudo .= "$t$t}\n";
        
        
        $conteudo .= "\n$t$t/**\n";
        $conteudo .= "$t$t " . '* Build data\'s part of json' . "\n";
        $conteudo .= "$t$t " . '* @param type $entity' . "\n";
        $conteudo .= "$t$t " . '* @return array' . "\n";
        $conteudo .= "$t$t */\n";
        $conteudo .= "$t$t" . 'public static function getJsonFromEntity($entity) {' . "\n";
        $conteudo .= "$t$t$t" . '$mat = array(';
        
        $iniciou = false;
        for ($i = 0; $i < count($objTabela->getCampos()); $i++) {
            $nomeCampo = $objTabela->getCampo($i);
            if ($nomeCampo != 'ativo') {
                $conteudo .= $iniciou ? ",\n" : '';
                $nomeAtributo = Util::nomeDbToAtributo($nomeCampo);
                
                if($iniciou) {
                    $conteudo .= "$t$t$t" . '             \'' . $nomeAtributo . '\' => ';
                } else {
                    $conteudo .= '\'' . $nomeAtributo . '\' => ';
                }
                
                $tipo = $objTabela->getNomeTipoCampo($i);
                if($tipo == 'date' && $nomeCampo != 'update_date') {
                    $conteudo .= 'Util::formatDateDBToShow($entity->get' . Util::nomeDbToClasse($nomeCampo) . '(), \'d/m/Y\')';
                } else {
                    $conteudo .= '$entity->get' . Util::nomeDbToClasse($nomeCampo) . '()';
                }
                $iniciou = true;
            }
        }
        $conteudo .= ');' . "\n";
        $conteudo .= "$t$t$t" . 'return $mat;' . "\n";
        $conteudo .= "$t$t}\n";

        /*
         * Criando metodo de validacao
         */
        $conteudo .= "\n$t$t/**\n";
        $conteudo .= "$t$t * Validando as informações de " . $varNameClasse . ".\n";
        $conteudo .= "$t$t */\n";
        $conteudo .= "$t$t" . 'public static function validarModel($model) {' . "\n";
        $conteudo .= "$t$t$t" . '$result = TRUE;' . "\n";
        $conteudo .= "$t$t$t" . '$erros = array();' . "\n";
        $conteudo .= "\n$t$t$t" . '//OBS: A funcao isEmpty deve receber uma variavel e não uma chamada a um metodo';

        for ($i = 0; $i < count($objTabela->getCampos()); $i++) {
            $nomeCampo = $objTabela->getCampo($i);
            /* Criando as chamadas as validações */
            if ($nomeCampo != 'id' && $nomeCampo != 'insert_date' && $nomeCampo != 'update_date' && $objTabela->getCampo($i) != 'ativo') {
                $nomeAtributo = Util::nomeDbToAtributo($nomeCampo);
                $tipo = $objTabela->getNomeTipoCampo($i);
                $nullVal = '';
                $itemVal = '';
                //Se não aceita null retorna 'NO'
                if ($objTabela->getNull($i) == 'NO') {
                    $nullVal  = "$t$t$t" . 'if (Util::isEmpty($' . $nomeAtributo . ')) {' . "\n";
                    $nullVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'Preenchimento obrigatório de ' . Util::nomeDbToLabel($nomeCampo) . '.\';' . "\n$t$t$t}";
                }

                $pos = strpos($nomeCampo, 'email');
                if (empty($itemVal) && ($pos !== false)) {
                    if(!empty($nullVal)) {
                        $itemVal .= ' else ';
                    } else {
                        $itemVal .= "$t$t$t";
                    }
                    $itemVal .= 'if(' . (empty($nullVal) ? 'Util::isNotEmpty($' . $nomeAtributo . ') && ' : '') . 'Util::isEmailInvalido($' . $nomeAtributo . ')) {' . "\n";
                    $itemVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'Email com formato inválido.\';' . "\n$t$t$t}";
                }
                
                $pos = strpos($nomeCampo, 'site');
                if (empty($itemVal) && ($pos !== false)) {
                    if(!empty($nullVal)) {
                        $itemVal .= ' else ';
                    } else {
                        $itemVal .= "$t$t$t";
                    }
                    $itemVal .= 'if(' . (empty($nullVal) ? 'Util::isNotEmpty($' . $nomeAtributo . ') && ' : '') . 'Util::isUrlInvalida($' . $nomeAtributo . ')) {' . "\n";
                    $itemVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'URL com formato inválido.\';' . "\n$t$t$t}";
                }
                
                $pos = strpos($nomeCampo, 'url');
                if (empty($itemVal) && ($pos !== false)) {
                    if(!empty($nullVal)) {
                        $itemVal .= ' else ';
                    } else {
                        $itemVal .= "$t$t$t";
                    }
                    $itemVal .= 'if(' . (empty($nullVal) ? 'Util::isNotEmpty($' . $nomeAtributo . ') && ' : '') . 'Util::isUrlInvalida($' . $nomeAtributo . ')) {' . "\n";
                    $itemVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'URL com formato inválido.\';' . "\n$t$t$t}";
                }
                
                $pos = strpos($nomeCampo, 'cpf');
                if (empty($itemVal) && ($pos !== false)) {
                    if(!empty($nullVal)) {
                        $itemVal = ' else ';
                    } else {
                        $itemVal = "$t$t$t";
                    }
                    $itemVal .= 'if(' . (empty($nullVal) ? 'Util::isNotEmpty($' . $nomeAtributo . ') && ' : '') . 'Util::isCPFInvalido($' . $nomeAtributo . ')) {' . "\n";
                    $itemVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'CPF com formato inválido.\';' . "\n$t$t$t}";
                }
                
                $pos = strpos($nomeCampo, 'cnpj');
                if (empty($itemVal) && ($pos !== false)) {
                    if(!empty($nullVal)) {
                        $itemVal = ' else ';
                    } else {
                        $itemVal = "$t$t$t";
                    }
                    $itemVal .= 'if(' . (empty($nullVal) ? 'Util::isNotEmpty($' . $nomeAtributo . ') && ' : '') . 'Util::isCNPJInvalido($' . $nomeAtributo . ')) {' . "\n";
                    $itemVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'CNPJ com formato inválido.\';' . "\n$t$t$t}";
                }
                
                //'int', 'date', 'double'
                if (empty($itemVal) && ($tipo == 'int')) {
                    if(!empty($nullVal)) {
                        $itemVal = ' else ';
                    } else {
                        $itemVal = "$t$t$t";
                    }
                    $itemVal .= 'if(' . (empty($nullVal) ? 'Util::isNotEmpty($' . $nomeAtributo . ') && ' : '') . 'Util::isIntInvalido($' . $nomeAtributo . ')) {' . "\n";
                    $itemVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'Número inteiro inválido.\';' . "\n$t$t$t}";
                }
                
                if (empty($itemVal) && ($tipo == 'double')) {
                    if(!empty($nullVal)) {
                        $itemVal = ' else ';
                    } else {
                        $itemVal = "$t$t$t";
                    }
                    $itemVal .= 'if(' . (empty($nullVal) ? 'Util::isNotEmpty($' . $nomeAtributo . ') && ' : '') . 'Util::isRealInvalido($' . $nomeAtributo . ')) {' . "\n";
                    $itemVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'Número inválido.\';' . "\n$t$t$t}";
                }
                
                if (empty($itemVal) && ($tipo == 'date')) {
                    if(!empty($nullVal)) {
                        $itemVal = ' else ';
                    } else {
                        $itemVal = "$t$t$t";
                    }
                    $itemVal .= 'if(' . (empty($nullVal) ? 'Util::isNotEmpty($' . $nomeAtributo . ') && ' : '') . 'Util::isDataInvalido($' . $nomeAtributo . ')) {' . "\n";
                    $itemVal .= "$t$t$t$t" . '$erros[\'' . $nomeAtributo . '\'] = \'Data inválida.\';' . "\n$t$t$t}";
                }
                
                //Item recebe algum tipo de validacao?
                if((!empty($nullVal)) || (!empty($itemVal))) {
                    $conteudo .= "\n\n$t$t$t" . '$' . Util::nomeDbToAtributo($objTabela->getCampo($i)) . ' = $model->get' . $varNameClasse . '()->get' . Util::nomeDbToClasse($objTabela->getCampo($i)) . '();' . "\n";
                    $conteudo .= $nullVal;
                    $conteudo .= $itemVal;
                }
            }
        }
        //Finalizando o metodo de validar model
        $conteudo .= "\n\n$t$t$t" . 'if(IHelper::ZERO < count($erros)) {' . "\n";
        $conteudo .= "$t$t$t$t";
        $conteudo .= 'if($log->isInfoEnabled()) {
                $log->logInfo(\'Modelo invalido.\');
            }' . "\n";
        $conteudo .= "\n$t$t$t$t" . '$model->setResult(ResultFactory::newResultFalhaValidacao($erros));' . "\n";
        $conteudo .= "$t$t$t$t" . '$result = FALSE;' . "\n";
        $conteudo .= "$t$t$t}\n";
        $conteudo .= "\n$t$t$t";
        $conteudo .= 'if($log->isInfoEnabled()) {
            $log->logInfo(\'Modelo validado com sucesso.\');
        }' . "\n";
        $conteudo .= "$t$t$t" . 'return $result;' . "\n$t$t}\n";
        
        $conteudo .= "$t}\n?>\n";

        return $conteudo;
    }

}

?>
